package main

import "fmt"

//使用递归=回溯 全排列

func permute(nums []int) [][]int{
	res =[][]int{}
	//传入的x是一个空切片，nums就是要传入的[]int={1,2,3}的全组合
	run(nums,[]int{})
	return res
}

var res [][]int

func run(nums []int,x []int){
	//停止循环的条件
	if len(nums) == len(x){
		//res是在外层设定好的一个存储最终结果的切片
		res =append(res,x)
		return
	}
	// [1,3,4]
	for i:=0 ;i<len(nums);i++{

 	exist :=false

 	for j:=0;j<len(x);j++{
 		if nums[i] ==x[j]{
 			exist =true
 			//最内层的break跳出最内存的循环。
 			break
		}
	}
	//continue暂停本次循环，执行下次循环。
	if exist{
		continue
	}
	//将i存入x中

	run(nums,append(x,nums[i]))
 }
}



//func permute(nums []int) [][]int {
//	if len(nums) == 1 {
//		return [][]int{nums}
//	}
//
//	res := [][]int{}
//
//	for i, num := range nums {
//		// 把num从 nums 拿出去 得到tmp
//		tmp := make([]int, len(nums)-1)
//		copy(tmp[0:], nums[0:i])
//		copy(tmp[i:], nums[i+1:])
//
//		// sub 是把num 拿出去后，数组中剩余数据的全排列
//		sub := permute(tmp)
//		for _, s := range sub {
//			res = append(res, append(s, num))
//		}
//	}
//	return res
//}

//var res [][]int
//func permute(nums []int) [][]int{
//	res =[][]int{}
//	backTrack(nums,len(nums),[]int{})
//	return res
//}
//
//func backTrack(nums []int,numsLen int ,path []int){
//	if len(nums)==0{
//		p:=make([]int,len(path))
//		copy(p,path)
//		res =append(res, p)
//	}
//	for i:=0;i<numsLen;i++{
//		cur :=nums[i]
//		path =append(path,cur)
//		nums =append(nums[:i],nums[i+1:]...)
//		backTrack(nums,len(nums),path)
//		nums =append(nums[:i],append([]int{cur},nums[i:]...)...)
//		path =path[:len(path)-1]
//	}
//}

func main(){
	var nums =[]int{2,3,4}
	fmt.Println(permute(nums))
}